home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / MCASM.RAR / MC_ASM.EXE / WROX_ASM / CH12 / COMMON / PALSORT.CPP < prev    next >
C/C++ Source or Header  |  1994-09-24  |  2KB  |  72 lines

  1. /************************************************************************/
  2. /* This header    contains implementation of sorting procedures        */
  3. /*                                    */
  4. /*   E.Podvoysky from ^Z for WROX press book, 1994            */
  5. /************************************************************************/
  6.  
  7. #include <mem.h>
  8. #include "palsort.h"
  9.  
  10. less_func  *less;
  11. ptr_array  pointer_array;
  12.  
  13.  
  14. void sort(int l, int r) {
  15.     int  i, j;
  16.     void  *x, *y;
  17.  
  18.     i = l;
  19.     j = r;
  20.     x = pointer_array[(l + r) >> 1]; // middle of array
  21.     do {
  22.         while (less(pointer_array[i], x)) i++;
  23.         while (less(x, pointer_array[j])) j--;
  24.         if (i <= j) {  // sic! , let i become > j!
  25.             y = pointer_array[i]; // swap pointers with indexes i and j
  26.             pointer_array[i] = pointer_array[j];
  27.             pointer_array[j] = y;
  28.             i++;
  29.             j--;
  30.         }
  31.     } while (i <= j);
  32.     if (l < j)  sort(l, j);
  33.     if (i < r)  sort(i, r);
  34. }
  35.  
  36. void quicksort(  ptr_array  ptrarr, less_func  less_fun, int l, int r) {
  37.     pointer_array =  ptrarr;
  38.     less = less_fun;
  39.     sort( l,r);
  40. }
  41.  
  42. BOOL long_less(void *p1, void *p2) {
  43.     return *((long *)p1) < *((long *)p2);
  44. }
  45.  
  46. void sort_palette_bright( BGRpalette &pal, int colors) {
  47.     long *values;
  48.     int j,num;
  49.     long **pointers;
  50.     BGRpalette *tmp;
  51.  
  52.     values = new long[256];
  53.     pointers  = new long * [256];
  54.     for (j = 0; j < 256; j++) values[j] =
  55.           (pal[j].r * 299L + pal[j].g * 587L + pal[j].b * 114L );
  56.  
  57.     for (j = 0; j < 256; j++) pointers[j] = values+j;
  58.  
  59.     quicksort( (ptr_array) pointers, long_less, 0, colors-1);
  60.  
  61.     tmp = new BGRpalette[1];
  62.     for (j = 0; j < colors-1; j++) {
  63.         num = pointers[j] - values;
  64.         (*tmp)[j] = pal[num];
  65.     }
  66.     memcpy(&pal, tmp, sizeof(BGRcolortype)*colors);
  67.     delete tmp;
  68.     delete values;
  69.     delete pointers;
  70. };
  71.  
  72.